仪器控制手册 | 您所在的位置:网站首页 › Nationallnstruments VisaNS › 仪器控制手册 |
仪器控制
概述前期准备VISA协议及辅助工具VISA协议辅助工具:NI-MAX
SCPI指令仪器硬件驱动
仪器控制方法方法一:仪器硬件驱动步骤①:导入第三方库 sa_api.dll,直接放在Debug文件夹中步骤②:直接使用驱动提供的函数
方法二:(适用LAN口通讯)用户自定义通讯方法三:基于VISA协议步骤①:引用第三方库 NI-VISA库步骤②:确定仪器资源的名称步骤③:打开一个 VISA 会话步骤④:发送数据步骤⑤:关闭该 VISA 会话
方法④ :使用visa接口(`本方法博主并未使用过`)步骤①:将Visa32.dll文件放在工程的debug目录下面步骤②:引用Visa32.dll里面的函数,具体的使用方法请参考:NI-Visa help
说明
概述
仪器控制,就是计算机通过介质(网线、GPIB线等)完成对设备的控制,包括状态控制以及数据查询等 前期准备需要了解VISA协议、SCPI指令、硬件驱动 VISA协议及辅助工具 VISA协议VISA是一个驱动程序软件架构,开发这一架构的目的在于统一与GPIB、串口、以太网/LAN、IEEE 1394和USB仪器的通信,并简化仪器的控制应用。 VISA是NI-VISA(Virtual Instrument Software Architecture 虚拟仪器软件架构)的简称,是美国国家仪器 NI(National1nstrLlrnent)公司开发的一种用来与各种仪器总线进行通信的高级应用编程接口。 控制流程如下: 安装NI-VISA(第三方库)后,安装一个软件,可以用来查看计算机连接的可使用设备资源。 SCPI (Standard Command for Programmable Instrumentation)程控仪器标准命令。 SCPI有公共的命令,即对所有的仪器都是可行的;也有特定的命令,即不同的仪器命令不同。但所有的命令都符合SCPI标准。 仪器硬件驱动有的仪器厂商可能会自己基于VISA或者SCPI开发仪器的驱动,也就是往高层做了进一步封装,同时也是是对VISA和SCPI做了进一步封装,这样就进一步简化了开发流程。我们可以根据驱动说明或者仪器的编程说明使用仪器驱动软件架构。需要实现什么功能,调用相应的驱动API即可。还可以参考提供的样例。 仪器控制方法 方法一:仪器硬件驱动例如:控制接收机SA44B,使用厂商提供的硬件驱动,signal_hound_sdk_11_02_20,提供的saOpenDevice()函数。 一个函数就集成了VISA中的若干步骤,实现连接硬件设备。 步骤①:导入第三方库 sa_api.dll,直接放在Debug文件夹中 步骤②:直接使用驱动提供的函数 Public Function saOpen() Try Dim openstatus As saStatus Dim status As Boolean = True openstatus = saOpenDevice(Id) If openstatus saStatus.saNoError Then saCloseDevice(Id) openstatus = saOpenDevice(Id) '将打开的设备的标识符赋值给Id End If If openstatus saStatus.saNoError Then MessageBox.Show("接收机连接失败!") errStatus = saGetErrorString(openstatus) status = False Return status Exit Function Else Return status End If Catch ex As Exception Console.WriteLine(errStatus) End Try End Function 方法二:(适用LAN口通讯)用户自定义通讯用户建立TCP/IP连接,通过Socket实现设备连接。 我们需要实现一个TCP的客户端,通过仪器提供的IP地址和PORT端口号,我们的客户端同仪器进行TCP连接,连接完成后给仪器发送“仪器语言”,同时也会接受到仪器的响应。 Imports System.Net Imports System.Net.Sockets Dim SockClient As Socket Public Sub SwitchConnect(ByVal IP As String) Dim Address As IPAddress = IPAddress.Parse(IP) Dim Endpoint As New IPEndPoint(Address, CType(5555, Integer)) Try '捕获异常 SockClient.Connect(Endpoint) '发起连接。成功则返回值为0 Catch ss As SocketException MessageBox.Show(ss.Message) Catch s As Exception MessageBox.Show(s.Message) End Try End Sub 方法三:基于VISA协议 步骤①:引用第三方库 NI-VISA库首先:添加库引用 将 NationalInstruments.Common 与 NationalInstruments.VisaNS 引用添加到您的项目。 NationalInstruments.Common 命名空间包括各种为许多 NI 驱动程序所使用的常见方法和属性。 NationalInstruments.VisaNS命名空间包括面向 VISA .Net API 的方法和属性然后:将 VisaNS 命名空间导入到您的应用 这样可以减少方法前缀的使用,更直接地访问对象 [C#] using NationalInstruments.VisaNS; [VB .Net] Imports NationalInstruments.VisaNS 步骤②:确定仪器资源的名称仪器资源名称,也称为仪器描述符,描述了VISA资源的准确名称和位置。 例如: ASRL1::INSTR 描述了位于您的计算机的 COM 端口 1 的仪器 GPIB0::13::INSTR 描述了一个位于位置 13 的 GPIB 仪器为了实现与一个使用 VISA 的仪器的通信,我们必须确定其地址和仪器描述符 步骤③:打开一个 VISA 会话一个会话是自 VISA .Net API 到一项资源的一个连接或链接。 MessageBasedSession 类适用于通过发送和接收文本字符串形式的消息进行通信的仪器 RegisterBasedSession 类被用于与通过读写寄存器进行通信的仪器进行通信 本文面向的仪器是EMC领域的仪器,多为MessageBasedSession类 首先:声明一个新的 MessageBasedSession: [注]声明为全局变量,因为任何一个VISA函数都需要访问该变量 [C#] private MessageBasedSession mbSession; [VB .Net] Private mbSession As MessageBasedSession然后:实例化一个MessageBasedSession对象 我们将使用静态方法(或者像在 Visual Basic 中那样称为共享方法)–ResourceManager 类的 GetLocalManager。该方法实例化一个新的 ResourceManager 对象。 这个新的 ResourceManager 对象包含一个名为 Open(打开)的函数,然后该函数实例化一个新的会话对象。最后,我们将新创建的会话对象映射到一个 MessageBasedSession [C#] mbSession = (MessageBasedSession)ResourceManager.GetLocalManager().Open(resourceString.Text); [VB .Net] mbSession = CType(ResourceManager.GetLocalManager().Open(resourceString.Text), MessageBasedSession)其中,resourceString.Text 就是前述的仪器描述符 (使用try catch来使代码更加健壮) [C#] try {mbSession = (MessageBasedSession)ResourceManager.GetLocalManager().Open(resourceString.Text); } catch(InvalidCastException) { MessageBox.Show("Resource selected must be a message-based session"); } catch(Exception exp) { MessageBox.Show(exp.Message); } [VB .Net] Try mbSession = CType(ResourceManager.GetLocalManager().Open(resourceString.Text), MessageBasedSession) Catch exp As InvalidCastException MessageBox.Show("Resource selected must be a message-based session") Catch exp As Exception MessageBox.Show(exp.Message) End Try 步骤④:发送数据在创建了一个与我们的仪器通信的会话之后,我们可以开始发送数据至该仪器,并读回其响应。 在于基于消息的仪器的通信中最为常用的三项操作为查询、写入和读取。 1.查询操作 : 将一个命令写入到一个仪器并读回其响应。 2.写入命令 : 仅发送一个命令至仪器。 3.读取命令 : 从仪器读取信息。 实例:查询操作 [C#] try { string responseString = mbSession.Query(stringToWrite.Text); } catch(Exception exp) { MessageBox.Show(exp.Message); } [VB .Net] Try Dim responseString As String = mbSession.Query(stringToWrite.Text) Catch exp As Exception MessageBox.Show(exp.Message End Try 步骤⑤:关闭该 VISA 会话为了关闭我们创建的与我们仪器通信的 VISA 会话,我们必须使用 MessageBasedSession 类的 Dispose(处置)方法。该方法释放为该会话分配的所有资源。 [C#] mbSession.Dispose(); [VB .Net] mbSession.Dispose()总结:NI-VISA 是一个面向多种仪器控制的快速且方便的解决方案。VISA .Net API 提供了一个面向对象的接口,以实现与您的仪器的方便通信。 方法④ :使用visa接口(本方法博主并未使用过) 步骤①:将Visa32.dll文件放在工程的debug目录下面 步骤②:引用Visa32.dll里面的函数,具体的使用方法请参考:NI-Visa help public bool Init(){ if (m_connect){ return m_connect; } viError = Visa32.viOpenDefaultRM(out m_viDefaultRM); if (viError != Visa32.VI_SUCCESS){ return false; } viError = Visa32.viOpen(m_viDefaultRM, resourceName, Visa32.VI_NO_LOCK, Visa32.VI_TMO_IMMEDIATE, out m_session); if (viError == Visa32.VI_SUCCESS){ m_connect = true; //clears spectrum清除寄存器 Visa32.viClear(m_session); viError = Visa32.viPrintf(m_session, "*CLS\n"); if (viError != Visa32.VI_SUCCESS){ m_connect = false; } System.Threading.Thread.Sleep(10); }else{ m_connect = false; } return m_connect; } 说明后经查资料,方法③和④的区别是,托管与非托管程序集的区别。 方法③使用是.NET Framwork提供的托管程序集, NationalInstruments.Common 与 NationalInstruments.VisaNS,相当于内置的第三方库。适用于C#和VB.NET语言 方法④使用是非托管程序集,VISA32.dll,真正的第三方库。使用C++也可以进行开发 ,有博主实现,参考2 参考1:C#使用NI VISA实现程控仪器的自动化控制 参考2:C++ 基于VISA控制电源 |
CopyRight 2018-2019 实验室设备网 版权所有 |